package main

import (
	"fmt"
	"time"
	"context"
)

func main() {
	ctx,cancel:=context.WithCancel(context.Background())
	go A(ctx)

	go func(){
		time.Sleep(time.Second)
		cancel()
	}()

	select{
	case <-ctx.Done():
		time.Sleep(time.Second)
	}
}

func A(inCtx context.Context) {
	ctx,_:=context.WithCancel(inCtx)
	go B(ctx)
}

func B(inCtx context.Context) {
	ctx,_:=context.WithCancel(inCtx)
	go C(ctx)
}

func C(inCtx context.Context) {
	ctx:=inCtx
	select {
	case <-ctx.Done():
		fmt.Println(ctx.Err())
	}
}
